#!/usr/bin/env python3
"""
并行测试运行脚本
支持并行执行测试并合并报告
"""

import subprocess
import sys
import os
from datetime import datetime
from utils.path_manager import path_manager


def run_parallel_tests(workers=4, test_path="cases/", merge_reports=True):
    """
    运行并行测试
    
    Args:
        workers (int): 并行进程数，默认4
        test_path (str): 测试路径，默认cases/
        merge_reports (bool): 是否合并报告，默认True
    """

    # 确保报告目录存在
    os.makedirs(path_manager.report_dir, exist_ok=True)

    # 生成时间戳
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

    if merge_reports:
        # 并行测试时，生成一个合并的报告文件
        report_name = f"parallel_test_report_{timestamp}.html"
        pytest_cmd = [
            "pytest",
            test_path,
            f"-n{workers}",  # 并行进程数
            "--dist=worksteal",  # 工作窃取策略，动态分配测试
            f"--html={path_manager.report_dir}/{report_name}",
            "--self-contained-html",
            "-v",
            "--tb=short"
        ]
        print(f"运行并行测试，将生成报告: {report_name}")
    else:
        # 不生成报告的并行测试
        pytest_cmd = [
            "pytest",
            test_path,
            f"-n{workers}",  # 并行进程数
            "--dist=worksteal",  # 工作窃取策略，动态分配测试
            "-v",
            "--tb=short"
        ]
        print(f"运行并行测试，不生成报告")

    print(f"开始并行测试，使用 {workers} 个进程...")
    print(f"测试路径: {test_path}")

    # 运行pytest
    result = subprocess.run(pytest_cmd, capture_output=False)

    if result.returncode == 0:
        if merge_reports:
            report_path = os.path.join(path_manager.report_dir, report_name)
            print(f"并行测试完成，报告已生成: {report_path}")
            return report_path
        else:
            print("并行测试完成")
            return None
    else:
        print(f"测试执行失败，退出码: {result.returncode}")
        return None


def main():
    """主函数，处理命令行参数"""
    import argparse

    parser = argparse.ArgumentParser(description="并行测试运行器")
    parser.add_argument("-n", "--workers", type=int, default=4,
                        help="并行进程数 (默认: 4)")
    parser.add_argument("-p", "--path", default="cases/",
                        help="测试路径 (默认: cases/)")
    parser.add_argument("--no-merge", action="store_true",
                        help="不合并报告")
    parser.add_argument("--browser-type", default="chrome",
                        help="浏览器类型 (默认: chrome)")

    args = parser.parse_args()

    # 设置浏览器类型环境变量
    os.environ["BROWSER_TYPE"] = args.browser_type

    # 运行并行测试
    exit_code = run_parallel_tests(
        workers=args.workers,
        test_path=args.path,
        merge_reports=not args.no_merge
    )

    sys.exit(exit_code)


if __name__ == "__main__":
    main()
